package com.qiche.service;

import com.qiche.aspect.Result;
import com.qiche.dto.*;
import com.qiche.model.*;
import com.qiche.requestpram.SubscribeParam;

import java.util.List;

/**
 * @author chendezhi
 * @date 2018/3/1 17:44
 */
public interface SubscribeService extends IService<Subscribe> {


	List<Subscribe> getServiceListByCustomerId(Long customerId);
	/**
	 * 去到 预约页面
	 *
	 * @param member
	 *            会员 (没有传入null)
	 * @param memberCarId
	 *            车辆信息id (没有传入null,有默认选中此id对应的车)
	 * @param merchantId
	 *            车店id
	 * @return
	 */
	 SubscribeDto toSubscribe(StoreMember storeMember, Long memberCarId, Long merchantId);

	/**
	 * 获取单个 会员预约详情
	 *
	 * @param subscribe
	 * @return
	 */
	 MemberSubscribeDetailDto memberSubscribeDetail(Subscribe subscribe);

	/**
	 * 通过会员 查询出 预约记录
	 *
	 * @param member
	 * @return
	 */
	 List<MemberSubscribeDetailDto> selectAllMemberSubscribe(StoreMember member,String status);

	/**
	 * 会员保存预约
	 * 保存预约,--> 同时保存 选择的服务项 同时生成服务项目实时工序记录
	 * @param subscribe
	 * @param productIds
	 * @return
	 */
	 Result subscribe(Subscribe subscribe, Long memberCarId, List<Long> productIds);

	/**
	 * 获取 门店 所有的预约 带分页
	 *
	 * @param user
	 *            确定门店
	 * @param subscribeStatus
	 *            过滤条件 预约状态,0预约中,-1取消,1开单,2结算.只有在开单状态可以添加服务
	 * @param pageNo
	 *            页码
	 * @param pageSize
	 *            一页展示数
	 * @return
	 */
	 UserSubscribeDto userSubscribeByStatus(User user, Byte subscribeStatus, Integer pageNo, Integer pageSize);

	/**
     * 获取 所有的 预约(不包含 结算状态)
     *
     * @param user     确定门店
     * @param pageNo   页码
     * @param pageSize 一页展示数
     * @return
     */
     UserSubscribeDto userAllSubscribe(User user,
                                             Integer pageNo,
                                             Integer pageSize,Integer status);

	/**
	 * 获取 所有的 服务(不包含 预约状态)
	 *
	 * @param user
	 *            确定门店
	 * @param pageNo
	 *            页码
	 * @param pageSize
	 *            一页展示数
	 * @return
	 */
	 UserSubscribeDto userAllService(User user, Integer pageNo, Integer pageSize,Integer status);

	/**
	 * 门店用户 获取 会员 预约详情
	 *
	 * @param subscribe
	 * @return
	 */
	 UserSubscribeDetaiDto userSubscribeDetail(Subscribe subscribe);

	/**
	 * 更改 订单状态
	 *
	 * @param subscribeId
	 * @param status
	 *            可变状态有: SubscribeStatusEnum.CANCEL -1 取消
	 *            SubscribeStatusEnum.OPEN_SUBSCRIBE 1 开单
	 *            SubscribeStatusEnum.CLOSE_SUBSCRIBE 2 结算 结算的同时 将所有服务费用算出,存入数据库
	 * @return
	 */
	 Result updateSubscribeStatus(Long subscribeId, Byte status);

	/**
	 * 通过 会员获取 其所有*最简*服务记录
	 *
	 * @param storeMember
	 *            会员
	 * @return
	 */
	 List<SimpleSubscribeDto> selectSimpleSubscribeDtoByMember(StoreMember storeMember);

	/**
	 * PC端查询 *预约*记录 通过过滤条件
	 *
	 * @param user
	 * @param subscribeParam
	 *            过滤条件 pageNo 开始页 pageSize 一页展示多少记录 startTime 开始时间 endTime 结束时间
	 *            keyword 关键字 姓名、电话、车牌 subscribeStatus 按状态查询 productName
	 *            服务名称(模糊查询)
	 * @return 返回: subscribeDetailDtos 预约项集合 subscribeParam 所有传入的参数,多total
	 *
	 */
	 PCUserSubscribeDto userSubscribeByParam(User user, SubscribeParam subscribeParam);

	/**
	 * PC端查询 *服务*记录 通过过滤条件
	 *
	 * @param user
	 * @param subscribeParam
	 *            过滤条件 pageNo 开始页 pageSize 一页展示多少记录 startTime 开始时间 endTime 结束时间
	 *            keyword 关键字 姓名、电话、车牌 subscribeStatus 按状态查询 productName
	 *            服务名称(模糊查询)
	 * @return 返回: subscribeDetailDtos 预约项集合 subscribeParam 所有传入的参数,多total
	 *
	 */
	 PCUserSubscribeDto userServiceByParam(User user, SubscribeParam subscribeParam);

	/**
	 * 根据 门店id,查询所有结算的 工单
	 * 
	 * @param merchantId
	 * @return
	 */
	List<Subscribe> selectAllColseByMerchantId(Integer merchantId);

	/**
	 * 查询预约时间段订单数
	 * @param merchantId
	 * @param subscribeTime
	 * @return
	 */
	Integer selectCountByMerchantIdSubscribeTimeStatus(Integer merchantId,String subscribeTime);
	/**
	 * 会员根据 状态码查询 对应的预约列表
	 * 
	 * @param member
	 * @param status
	 *            可变状态有: SubscribeStatusEnum.CANCEL -1 取消
	 *            SubscribeStatusEnum.OPEN_SUBSCRIBE 1 开单
	 *            SubscribeStatusEnum.CLOSE_SUBSCRIBE 2 结算 结算的同时 将所有服务费用算出,存入数据库
	 * @return
	 */
	List<MemberSubscribeDetailDto> selectSubscribeBysToreMemberAndStatus(StoreMember member, String status);

	/**
	 * 门店 保存 预约
	 * 
	 * @param subscribe
	 * @param productIds
	 * @return
	 */
	Result<Subscribe> userSubscribe(Subscribe subscribe, List<Long> productIds);


	/**
	 * 门店 更新 预约
	 * @param subscribe
	 * @param productIds
	 * @return
	 */
	int userSubscribeUpdate(Subscribe subscribe, List<Long> productIds);
}
